/*
 * ArbolBMas.h
 *
 *  Created on: Sep 21, 2011
 *      Author: Nodo Team
 */

#ifndef ARBOLBMAS_H_
#define ARBOLBMAS_H_

#include <vector>
#include "ResultadoOperacion.h"
#include "Registro.h"
#include "RegistroInterno.h"
#include "Nodo.h"
#include "NodoHoja.h"
#include "NodoInterno.h"

using namespace std;

class ArbolBMas {

private:
	int capacidadMaximaNodosInternos;
	int capacidadMinimaNodosInternos;
	int capacidadMaximaNodosHoja;
	int capacidadMinimaNodosHoja;
	//Archivos de Nodos Libres
	//Archivos de Nodos
	Nodo* raiz;
	Nodo* ultimaHojaLeida;

public:
	ArbolBMas();
	void insertar(Registro* dato);
	virtual ~ArbolBMas();

    Nodo* getRaiz() const;
    Nodo* getUltimaHojaLeida() const;
    void setRaiz(Nodo *raiz);
    void setUltimaHojaLeida(Nodo *ultimaHojaLeida);
    void guardarNodo(Nodo* nodo);
    Nodo* getNodo(int numeroNodo);
    Nodo* getNodoNuevo(int nivelNodoHijo);
    int numeroNodoHijoALeer(Nodo* nodo, int clave);
    int getCapacidadMaximaNodosHoja() const;
    int getCapacidadMaximaNodosInternos() const;
    int getCapacidadMinimaNodosHoja() const;
    int getCapacidadMinimaNodosInternos() const;
    void setCapacidadMaximaNodosHoja(int capacidadMaximaNodosHoja);
    void setCapacidadMaximaNodosInternos(int capacidadMaximaNodosInternos);
    void setCapacidadMinimaNodosHoja(int capacidadMinimaNodosHoja);
    void setCapacidadMinimaNodosInternos(int capacidadMinimaNodosInternos);

private:
	ResultadoOperacion insertarInterno(Nodo* nodo, Registro* dato);
//	void setNodoNuevoHoja(Nodo* nodoNuevo, Nodo* nodoHijo);
//	void setNodoNuevoInterno(Nodo* nodoNuevo, int nivelNodo);
	void setNodoNuevo(Nodo* nodoNuevo, Nodo* nodoHijo);
};

#endif /* ARBOLBMAS_H_ */
